#include <stdio.h>
#include <math.h>

#include "minigame_ui.h"
#include "main_ui.h"
#include "md_images.h"
#include "ui_setting.h"
#include "esp_log.h"
#include "game.h"

#define icon_angle 45 // 图标间隔角度（45度一个图标）
#define icon_scale 5  // 图标放大倍数
// 声明字体
LV_FONT_DECLARE(myFont);
LV_FONT_DECLARE(lv_font_montserrat_14);

static lv_obj_t *current_minigame_screen = NULL;
static lv_obj_t *minigame_screen_old = NULL;

static lv_point_t tempxy[360]; // 存储360个坐标点的数组
static lv_obj_t *btn[8];       // 存储8个按钮对象的数组

// 函数声明
static void calculateCoordinates(float centerX, float centerY, float radius, float angle, lv_point_t *outxy);
static void slider2_released_cb(lv_event_t *e);
static void anim_angle_cb(void *var, int32_t v);
static void anim_delect_cb(lv_anim_t *a);
static void slider1_cb(lv_event_t *e);

// 全局状态变量
int touched2 = 0;    // 触摸状态标志（0=未触摸，1=已触摸）
int j = 0;           // 触摸移动距离（角度增量）
int old_angle = 360; // 上一次旋转后的基准角度
int numx;            // 未使用的变量（可删除）
int xo, yo;          // 圆心坐标

void exit_minigame_ui(lv_obj_t *root)
{
    lv_anim_del_all();       // 删除所有动画
    switch_to_main_screen(); // 切换到主界面
    /*删除对应的逻辑分析仪界面，防止多次调用，内存泄漏*/
    /*因为功能界面多,而且不常用,所以删除*/
    lv_obj_del(root); //也可以把lv_scr_load_anim的auto_del设置为true
}
// 手势事件回调
static void event_handler(lv_event_t *e)
{
    lv_event_code_t code = lv_event_get_code(e);

    if (code == LV_EVENT_GESTURE) {
        lv_indev_t *indev = lv_indev_get_act();
        if (!indev)
            return;

        lv_dir_t dir = lv_indev_get_gesture_dir(indev);

        // 保留右划检测
        if (dir == LV_DIR_TOP) {
            exit_minigame_ui(e->target);
        }
    }
}

// 刷新设置界面函数
void refresh_minigame_ui(void)
{
    minigame_screen_old = current_minigame_screen;
    lv_anim_del_all(); // 删除所有动画
    // 创建新界面
    lv_obj_t *new_screen = create_minigame_ui();
    if (new_screen) {
        // 加载新界面
        lv_scr_load(new_screen);
        // 删除旧界面
        lv_obj_del(minigame_screen_old);
        minigame_screen_old = NULL;
    }
}

/*
 * 调用游戏函数
*/
uint8_t index2[8] = { 6, 5, 4, 3, 2, 1, 0, 7 };
static void open_click_game_cb(lv_event_t *e)
{
    uint16_t index = old_angle / icon_angle % 8;

    /*
        顺时钟转（0-7）相隔45°，在最上方的是 6  对应index=0
    */
    index = index2[index];
    //ESP_LOGI("MdLink", "open game %d", index);
    switch_game_load(index);
}
/* 
 * @ brief:创建游戏界面
*/
lv_obj_t *create_minigame_ui(void)
{
    // 创建根容器（全屏黑色背景）
    lv_obj_t *root = lv_obj_create(NULL);
    if (!root)
        return NULL;
    lv_obj_set_size(root, lv_pct(100), lv_pct(100));
    lv_obj_set_style_bg_color(root, lv_color_hex(get_screen_color_val()), LV_PART_MAIN);
    lv_obj_add_event_cb(root, event_handler, LV_EVENT_GESTURE, NULL);
    // 禁用滚动
    lv_obj_clear_flag(root, LV_OBJ_FLAG_SCROLLABLE);

    int i;
    // 计算圆心坐标（屏幕中心偏下）
    xo = lv_disp_get_hor_res(lv_disp_get_default()) / 2 - 28;
    yo = lv_disp_get_ver_res(lv_disp_get_default()) / 2 + 94;

    // 预计算圆上360个点的坐标
    for (i = 0; i < 360; i++) {
        // 计算每个角度的坐标（角度转换为弧度）
        calculateCoordinates(xo, yo, 130, i * 3.1416 / 180, &tempxy[i]);
    }



    // 创建并布置8个图标按钮
    for (i = 0; i < 8; i++) {
        btn[i] = lv_img_create(root); // 创建图像对象
        lv_img_set_src(btn[i], get_func_image_data(FUNC_MINIGAME, i)); // 设置图像源
        // 将图标放置在圆上（每45度一个）
        lv_obj_set_pos(btn[i], tempxy[i * icon_angle].x, tempxy[i * icon_angle].y);
        lv_obj_refr_pos(btn[i]); // 立即刷新位置

        if (lv_obj_get_y(btn[i]) <= tempxy[225].y) {
            lv_img_set_zoom(btn[i], 255 + ((tempxy[225].y - lv_obj_get_y(btn[i])) * icon_scale));
        }
    }


    // 创建全屏透明触摸区域
    lv_obj_t *obj1 = lv_obj_create(root);
    lv_obj_set_size(obj1, lv_disp_get_hor_res(lv_disp_get_default()),
                    lv_disp_get_ver_res(lv_disp_get_default()));
    lv_obj_set_style_bg_opa(obj1, 0, LV_PART_MAIN);     // 透明背景
    lv_obj_set_style_border_opa(obj1, 0, LV_PART_MAIN); // 透明边框
    // 绑定触摸事件回调
    lv_obj_add_event_cb(obj1, slider1_cb, LV_EVENT_PRESSING, NULL);          // 按压中
    lv_obj_add_event_cb(obj1, slider2_released_cb, LV_EVENT_RELEASED, NULL); // 释放

    // 在270度位置创建一个圆形按钮（装饰用）
    lv_obj_t *btn1 = lv_obj_create(root);
    lv_obj_set_pos(btn1, tempxy[270].x - 25, tempxy[270].y - 25);
    lv_obj_set_size(btn1, 113, 113);
    lv_obj_set_style_bg_opa(btn1, 0, LV_PART_MAIN); // 透明背景
    lv_obj_set_style_radius(btn1, 6, LV_PART_MAIN); // 圆形
    lv_obj_add_flag(btn1, LV_OBJ_FLAG_CLICKABLE);   // 可点击
    // 添加点击事件回调
    lv_obj_add_event_cb(btn1, open_click_game_cb, LV_EVENT_CLICKED, NULL);
    current_minigame_screen = root;
    return root;
}

// 触摸拖动处理回调
static void slider1_cb(lv_event_t *e)
{
    static lv_point_t click_point1; // 首次触摸点
    static lv_point_t click_point2; // 当前触摸点
    int touch_area;                 // 触摸区域（1=上，2=右，3=下，4=左）

    if (touched2 == 0) {
        // 记录首次触摸点
        lv_indev_get_point(lv_indev_get_act(), &click_point1);
        touched2 = 1;
        j = 0;
        return;
    } else {
        // 获取当前触摸点
        lv_indev_get_point(lv_indev_get_act(), &click_point2);
    }

    // 确定触摸区域（基于圆心坐标）
    if (click_point2.y < yo &&
        (yo - click_point2.y) > (click_point2.x - xo) &&
        (yo - click_point2.y) > xo - click_point2.x) {
        touch_area = 1; // 上方区域
    }
    if (click_point2.x > xo &&
        (click_point2.x - xo) > (click_point2.y - yo) &&
        (click_point2.x - xo) > yo - click_point2.y) {
        touch_area = 2; // 右方区域
    }
    if (click_point2.y > yo &&
        (click_point2.y - yo) > (click_point2.x - xo) &&
        (click_point2.y - yo) > xo - click_point2.x) {
        touch_area = 3; // 下方区域
    }
    if (click_point2.x < xo &&
        (xo - click_point2.x) > (click_point2.y - yo) &&
        (xo - click_point2.x) > yo - click_point2.y) {
        touch_area = 4; // 左方区域
    }

    // 根据区域计算旋转增量
    switch (touch_area) {
        case 1:
            j += (click_point2.x - click_point1.x);
            break; // 上：水平移动
        case 2:
            j += (click_point2.y - click_point1.y);
            break; // 右：垂直移动
        case 3:
            j += (click_point1.x - click_point2.x);
            break; // 下：水平反向
        case 4:
            j += (click_point1.y - click_point2.y);
            break; // 左：垂直反向
    }

    // 角度归一化（0-359度）
    if (j < 0)
        j += 360;
    if (j >= 360)
        j -= 360;

    // 更新参考点为当前点
    click_point1.x = click_point2.x;
    click_point1.y = click_point2.y;

    // 更新所有图标位置
    for (int i = 0; i < 8; i++) {
        // 计算新位置（考虑历史角度和当前偏移）
        int index = (i * icon_angle + j + old_angle) % 360;
        lv_obj_set_pos(btn[i], tempxy[index].x, tempxy[index].y);
        lv_obj_refr_pos(btn[i]); // 立即刷新

        // 动态缩放：圆下半部分图标放大
        if (lv_obj_get_y(btn[i]) <= tempxy[225].y) {
            lv_img_set_zoom(btn[i], 255 + ((tempxy[225].y - lv_obj_get_y(btn[i])) * icon_scale));
        } else {
            lv_img_set_zoom(btn[i], 255); // 恢复原始大小
        }
    }
}

// 触摸释放处理回调
static void slider2_released_cb(lv_event_t *e)
{
    if (touched2 == 1) {
        old_angle += j; // 更新基准角度
        touched2 = 0;   // 重置触摸状态
    }

    // 基准角度归一化（360-719度）
    if (old_angle < 360)
        old_angle += 360;
    if (old_angle >= 720)
        old_angle -= 360;

    // 计算到最近图标的角度余数
    int remainder = old_angle % icon_angle;

    // 启动归位动画（自动对齐到最近的图标位置）
    lv_anim_t a;
    lv_anim_init(&a);
    lv_anim_set_exec_cb(&a, anim_angle_cb); // 设置动画回调
    lv_anim_set_time(&a, 200);              // 动画时长200ms

    // 判断归位方向（向前或向后对齐）
    if (remainder <= 23) { // 靠近前一个图标
        lv_anim_set_values(&a, old_angle, old_angle - remainder);
    } else { // 靠近后一个图标
        lv_anim_set_values(&a, old_angle, old_angle - remainder + icon_angle);
    }

    lv_anim_set_ready_cb(&a, anim_delect_cb); // 动画结束回调
    lv_anim_start(&a);
}

// 动画执行回调（更新图标位置）
void anim_angle_cb(void *var, int32_t v)
{
    for (int i = 0; i < 8; i++) {
        int index = (i * icon_angle + v) % 360;
        lv_obj_set_pos(btn[i], tempxy[index].x, tempxy[index].y);
        lv_obj_refr_pos(btn[i]);

        // 动态缩放处理
        if (lv_obj_get_y(btn[i]) <= tempxy[225].y) {
            lv_img_set_zoom(btn[i], 255 + ((tempxy[225].y - lv_obj_get_y(btn[i])) * icon_scale));
        } else {
            lv_img_set_zoom(btn[i], 255);
        }
    }
}

// 动画结束回调（最终对齐处理）
void anim_delect_cb(lv_anim_t *a)
{
    int remainder = old_angle % icon_angle;

    if (remainder > 23) {
        old_angle = old_angle - remainder + icon_angle;
    } else {
        old_angle = old_angle - remainder;
    }

    // 输出当前选中的图标索引（0-7）
    // printf("%d ", old_angle / icon_angle % 8);
}

// 计算圆上点的坐标
void calculateCoordinates(float centerX, float centerY, float radius, float angle, lv_point_t *outxy)
{
    float xOffset = radius * cos(angle);
    float yOffset = radius * sin(angle);
    outxy->x = centerX + xOffset;
    outxy->y = centerY + yOffset;
}